// 如何准确的判断数据类型？
// typeof
// !问题：不能准确的区分出来复杂数据类型
/* const arr = []
const obj = {}
console.log(typeof arr) // 'object'
console.log(typeof obj) // 'object' */

// instanceof
// !作用：判断左边的对象和右边的构造函数的 prototype 在不在一条原型链上，或者左边的对象.__proto__能不能找到右边.prototype
/* const arr = []
const obj = {}
console.log(arr instanceof Object) // true
// console.log(arr.__proto__ === Array.prototype)
// console.log(Array.prototype.__proto__ === Object.prototype)
console.log(arr.__proto__.__proto__ === Object.prototype)
console.log(obj instanceof Object) // true
console.log(obj.__proto__ === Object.prototype) */

/* const obj = {}
console.log(Array.isArray(obj)) // 只能区分是或者不是，不是数组又是啥呢？不知道 */

/* const arr = []
const obj = {}
const tempNull = null
const tempUndefined = undefined
const num = 1
const str = '1'
const fn = function () {}
console.log(Object.prototype.toString.call(arr))
console.log(Object.prototype.toString.call(obj))
console.log(Object.prototype.toString.call(tempNull))
console.log(Object.prototype.toString.call(tempUndefined))
console.log(Object.prototype.toString.call(num))
console.log(Object.prototype.toString.call(str))
console.log(Object.prototype.toString.call(fn)) */

/* const arr = []
const obj = {}
const tempNull = null
const tempUndefined = undefined

function pdType(con) {
  const str = Object.prototype.toString.call(con)
  switch (str) {
    case '[object Array]':
      return '数组'
    case '[object Object]':
      return '对象'
    case '[object Undefined]':
      return 'undefined'
    case '[object Null]':
      return 'null'
    default:
      return '未知'
  }
}
console.log(pdType(arr))
console.log(pdType(obj))
console.log(pdType(tempNull))
console.log(pdType(tempUndefined)) */

// !卡住了
const arr = []
// 字面意思：调用 Object.prototype.toString 的同时用 call 来改变此方法内部的 this 指向
// “借用” Object.prototype 上的 toString 方法
Object.prototype.toString.call(arr)
console.log(arr)
// Object.prototype.toString.apply(arr)

// 需求：往 obj 里面加一项 'c'
const obj = {
  0: 'a',
  1: 'b',
  length: 2,
}

/* obj[2] = 'c'
obj.length++
console.log(obj) */
// 不能 push，因为 obj 都没有 push 方法
// obj.push('c')
// 答案：借用
// obj 借用了数组原型上的方法 push，加了一个 c
/* Array.prototype.push.call(obj, 'c')
console.log(obj) */

/* Array.prototype.push2 = function (con) {
  this[this.length] = con
  this.length++
} */
/* Array.prototype.push2.call(obj, 'c')
console.log(obj) */

/* let arr = [1]
console.log(arr.slice()) // [1] */

function fn() {
  // 求所有实参的和，以及 2, 3, 4
  const arr = Array.prototype.slice.call(arguments)
  // const arr = [].slice.call(arguments)
  // const arr = [].__proto__.slice.call(arguments)
  arr.push(2, 3, 4) // 为数组转真数组
  console.log(arr)
}
fn(1, 2, 3)
